package main

import "fmt"

func test(n int) {
	if n > 2 {
		n--
		test(n)
	}
	fmt.Println(n)
}

//labyrinthMap 保证是同一个地图，使用引用
//i,j 表示对地图的那个点进行测试
func SetWay(labyrinthMap *[8][7]int, i, j int) bool {
	//分析出什么情况下，就找到出路
	if labyrinthMap[6][5] == 2 {
		return true
	} else {
		//说明要继续找
		if labyrinthMap[i][j] == 0 {
			//这个点可以探测,
			labyrinthMap[i][j] = 2
			//左右下上
			//if SetWay(labyrinthMap,i-1,j){
			//	return true
			//}else if SetWay(labyrinthMap,i+1,j){
			//	return true
			//}else if SetWay(labyrinthMap,i,j+1){
			//	return true
			//}else if SetWay(labyrinthMap,i,j-1){
			//	return true
			//}else{
			//	labyrinthMap[i][j] = 3
			//	return false
			//}

			if SetWay(labyrinthMap, i+1, j) {
				return true
			} else if SetWay(labyrinthMap, i, j+1) {
				return true
			} else if SetWay(labyrinthMap, i-1, j) {
				return true
			} else if SetWay(labyrinthMap, i, j-1) {
				return true
			} else {
				labyrinthMap[i][j] = 3
				return false
			}

		} else {
			//这个点不能探测，为1，是墙
			return false
		}
	}
}

func main() {
	//先创建一个二维数组，模拟迷宫
	//规则
	//1、如果元素的值为1，就是墙
	//2、如果元素的值为0，是没有走过的点
	//3、如果元素的值为2，是一个通路
	//4、如果元素的值为3，是走过的路，但是走不通
	var labyrinthMap [8][7]int
	//先把迷宫的最上和最下设置为1
	for i := 0; i < 7; i++ {
		labyrinthMap[0][i] = 1
		labyrinthMap[7][i] = 1
	}
	//再把迷宫的最左和最右设置为1
	for i := 0; i < 8; i++ {
		labyrinthMap[i][0] = 1
		labyrinthMap[i][6] = 1
	}

	labyrinthMap[3][1] = 1
	labyrinthMap[3][2] = 1

	//输出地图
	for i := 0; i < 8; i++ {
		for j := 0; j < 7; j++ {
			fmt.Print(labyrinthMap[i][j], "\t")
		}
		fmt.Println()
	}
	SetWay(&labyrinthMap, 1, 1)
	fmt.Println()
	//输出地图
	for i := 0; i < 8; i++ {
		for j := 0; j < 7; j++ {
			fmt.Print(labyrinthMap[i][j], "\t")
		}
		fmt.Println()
	}
}
